package com.albaba.designpattern.beans;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @Description: 该类用来存储和遍历多个PropertyValue对象
 * @Author zx
 * @Date 2025/3/8 16:34
 * @Version 1.0
 */
public class MutablePropertyValues implements Iterable<PropertyValue> {

    // 集合：存储PropertyValue
    private final List<PropertyValue> propertyValueList;

    public MutablePropertyValues() {
        this.propertyValueList = new ArrayList<>();
    }

    // 有参构造 接收一个外部传入的list，赋值给 propertyValueList 属性
    public MutablePropertyValues(List<PropertyValue> propertyValueList) {
        if (propertyValueList == null) {
            this.propertyValueList = new ArrayList<>();
        } else {
            this.propertyValueList = propertyValueList;
        }
    }

    // 获取当前容器对应的迭代器对象
    @Override
    public Iterator<PropertyValue> iterator() {
        // 直接获取 list 集合对应的迭代器
        return propertyValueList.iterator();
    }

    // 获取所有的PropertyValue
    public PropertyValue[] getPropertyValues() {
        return propertyValueList.toArray(new PropertyValue[0]);
    }

    // 根据 name 属性获取对应的 PropertyValue 对象
    public PropertyValue getPropertyValue(String propertyName) {
        for (PropertyValue propertyValue : propertyValueList) {
            if (propertyValue.getName().equals(propertyName)) {
                return propertyValue;
            }
        }
        return null;
    }

    // 判断集合是否为空
    public boolean isEmpty() {
        return propertyValueList.isEmpty();
    }

    // 向集合中添加元素
    public MutablePropertyValues addPropertyValue(PropertyValue propertyValue) {
        // 判断集合中存储的PropertyValue是否重复，重复就覆盖

        for (int i = 0; i < propertyValueList.size(); i++) {

            PropertyValue currentPv = propertyValueList.get(i);

            if (currentPv.getName().equals(propertyValue.getName())) {
                // 覆盖
                propertyValueList.set(i, currentPv);
                return this;
            }
        }
        // 没有重复
        propertyValueList.add(propertyValue);
        // 目的是为了链式编程
        return this;

    }

    // 判断是否有指定 name 属性指的对象
    public boolean contains(String propertyName) {
        return getPropertyValue(propertyName) != null;
    }

    @Override
    public String toString() {
        return "MutablePropertyValues{" +
                "propertyValueList=" + propertyValueList +
                '}';
    }
}
